/**
 * 给定一个数组，分成3段，分别求异或和、或和、与和，
 * 使得三者相加和最大。
 * 
 * 首先与的数越少越少，因此第三段固定为A[N-1]
 * 然后可以计算出[0...N-2]的前缀和异或和与后缀或和
 * 枚举每一个位置，求三者和最大
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using llt = long long;
using vi = vector<int>;

int N;
vector<llt> A;

llt proc(){
    vector<llt> huo(N, 0);
    huo[N - 2] = A[N - 2];
    for(int i=N-3;i>=0;--i){
        huo[i] = huo[i + 1] | A[i];
    }

    llt ans = 0;
    llt yi = A[0];
    for(int i=1;i<N-1;++i){
        auto tmp = yi + huo[i];
        ans = max(ans, tmp);
        yi ^= A[i]; 
    }

    auto t3 = A[N - 1];
    return ans + t3;
}

void work(){
    cin >> N;
    A.assign(N, {});
    for(auto & i : A) cin >> i;
    cout << proc() << "\n";
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}